package com.sz.common.core.service;

import com.sz.common.core.service.role.MembershipType;

import java.io.Serializable;
import java.util.List;

/**
 * Function: Principal <br>
 * Author: Charles <br>
 * Date: 2016-11-03 16:48:00
 */
public interface Principal extends Serializable {

    /**
     * 获取域Id.
     *
     * @return 域Id
     */
    int getDomainId();

    /**
     * 获取账户登录名，可能为运营账户，供应商，或者客户.
     *
     * @return 账户登录名
     */
    String getAccountName();

    /**
     * 设置账户登录名.
     *
     * @param name accountName
     */
    void setAccountName(String name);

    /**
     * 获取账户Id，可能为运营账户，供应商，或者客户.
     *
     * @return 账户Id
     */
    int getAccountId();

    /**
     * 获取全名称.
     *
     * @return 全名称
     */
    String getFriendlyName();

    /**
     * 设置全名称.
     *
     * @param friendlyName 全名称
     */
    void setFriendlyName(String friendlyName);

    /**
     * 获取登录IP.
     *
     * @return 登录IP
     */
    String getIpAddr();

    /**
     * 设置登录IP.
     *
     * @param ipAddr 登录IP
     */
    void setIpAddr(String ipAddr);

    /**
     * 判断是否是ROOT账户.
     *
     * @return 是否是ROOT账户
     */
    boolean isRoot();

    /**
     * 是否具备管理权限
     *
     * @return
     */
    boolean isAdmin();

    /**
     * 获取管理的账户Id
     *
     * @return
     */
    int getAssociatedAccountId();

    /**
     * 设置关联的账户ID
     *
     * @param associatedAccountId
     */
    void setAssociatedAccountId(int associatedAccountId);

    /**
     * 获取关联的账户名
     *
     * @return
     */
    String getAssociatedAccountName();

    /**
     * 设置关联的账户名
     *
     * @param associatedAccountName
     */
    void setAssociatedAccountName(String associatedAccountName);

    /**
     * 获取Account成员类型
     *
     * @return
     */
    MembershipType getMembershipType();

    /**
     * 获取当前账户的角色Id列表.
     *
     * @return 角色Id列表
     */
    List<Integer> getRoleIds();

    /**
     * 获取角色code列表.
     *
     * @return 角色code列表
     */
    List<String> getRoles();

    /**
     * 获取当前账户下的权限Id列表.
     *
     * @return 权限Id列表
     */
    List<Integer> getPermissionIds();

    /**
     * 获取当前账户下的权限列表.
     *
     * @return 权限编码列表
     */
    List<String> getPermissions();

    /**
     * 获取当前账户的local language.
     *
     * @return 获取到的language信息
     */
    String getPreferredLanguage();

    /**
     * 设置当前账户的local language.
     */
    void setPreferredLanguage(String language);

    /**
     * 刷新角色
     */
    void refreshRoles();

    /**
     * 刷新权限
     */
    void refreshPermissions();

    void setListener(PrincipalListener listener);

    /**
     * 是否是匿名用户
     *
     * @return
     */
    boolean isAnonymous();
}
